package com.devenv.dto;

import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 系统配置DTO
 * <p>
 * 用于传输系统配置信息数据
 * </p>
 * 
 * @author DevEnv OpenSource Team
 * @version 1.0.0
 * @since 1.0.0
 */
@Data
public class SystemConfigDTO {
    private Long id;
    
    @NotBlank(message = "配置键不能为空")
    @Size(max = 100, message = "配置键长度不能超过100字符")
    private String configKey;
    
    @NotBlank(message = "配置值不能为空")
    private String configValue;
    
    @Size(max = 200, message = "描述长度不能超过200字符")
    private String description;
    
    private Boolean isSystem;
    private Boolean isPublic;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    /**
     * 检查配置是否为系统配置
     */
    public boolean isSystemConfig() {
        return Boolean.TRUE.equals(isSystem);
    }

    /**
     * 检查配置是否为公开配置
     */
    public boolean isPublicConfig() {
        return Boolean.TRUE.equals(isPublic);
    }

    /**
     * 获取配置类型描述
     */
    public String getConfigType() {
        if (isSystemConfig()) {
            return "系统配置";
        } else if (isPublicConfig()) {
            return "公开配置";
        } else {
            return "私有配置";
        }
    }

    /**
     * 检查配置值是否为布尔类型
     */
    public boolean isBooleanValue() {
        if (configValue == null) return false;
        return "true".equalsIgnoreCase(configValue) || "false".equalsIgnoreCase(configValue);
    }

    /**
     * 获取布尔值
     */
    public Boolean getBooleanValue() {
        if (isBooleanValue()) {
            return Boolean.parseBoolean(configValue);
        }
        return null;
    }

    /**
     * 检查配置值是否为数字类型
     */
    public boolean isNumericValue() {
        if (configValue == null) return false;
        try {
            Double.parseDouble(configValue);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * 获取数字值
     */
    public Double getNumericValue() {
        if (isNumericValue()) {
            return Double.parseDouble(configValue);
        }
        return null;
    }

    /**
     * 获取整数值
     */
    public Integer getIntegerValue() {
        if (isNumericValue()) {
            try {
                return Integer.parseInt(configValue);
            } catch (NumberFormatException e) {
                return null;
            }
        }
        return null;
    }
}
